package com.heima.leetcode.practice;

/**
 * @author 勾新杰
 * @version 1.0
 * @description: leetcode 6. Z字形转换
 * @date 2025/3/9 13:59
 */
public class E6 {

    /**
     * <h3>方法一：遍历的时候就把每行的字符串拼接起来</h3>
     *
     * @param s       字符串
     * @param numRows 行数
     * @return 转换结果
     */
    public String convert(String s, int numRows) {
        // 1. 当行数为1时，直接返回原字符串
        if (numRows == 1) return s;
        // 2. 准备变量，topToBottom为方向标志，row为当前行数，rowsBuilder为每行的字符串
        char[] charArray = s.toCharArray();
        boolean topToBottom = true;
        int row = 0;
        StringBuilder[] rowsBuilder = new StringBuilder[numRows];
        // 这里不能直接换成增强for循环，增强for循环只能用于数组或集合的只读操作，
        // 不能用于初始化或修改数组中的元素（注意是可以修改基本数组的值，但是不能修改引用）
        // 无法访问索引、无法修改引用，所以对引用直接赋值并不会改变原来的值
        for (int i = 0; i < numRows; i++)
            rowsBuilder[i] = new StringBuilder();
        // 3. 遍历字符串
        for (char c : charArray) {
            // 3.1 根据当前行数，拼接对应行的字符串
            rowsBuilder[row].append(c);
            // 3.2 根据方向标志，移动游标（行数）
            if (topToBottom) {
                if (++row == numRows - 1)
                    // 触底反弹
                    topToBottom = false;
            } else {
                if (--row == 0)
                    // 触底反弹
                    topToBottom = true;
            }
        }
        // 4. 拼接每行的字符串
        StringBuilder result = new StringBuilder();
        for (StringBuilder builder : rowsBuilder)
            result.append(builder);
        // 5. 返回结果
        return result.toString();
    }
}
